#include "key.h"

void keyInit(){

	//时钟使能
	RCC_APB2PeriphClockCmd(KEY_PORT_RCC,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	// 使能 AFIO 时钟
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);// 关闭JTAG 和 SWD 功能
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);	// 关闭JTAG 和 SWD 功能

	//初始化4个按键的gpio
	GPIO_InitTypeDef initDef;
	initDef.GPIO_Pin = KEY1_PIN | KEY2_PIN | KEY3_PIN| KEY4_PIN;
	initDef.GPIO_Mode =  GPIO_Mode_IPU;
	GPIO_Init(KEY_PORT,&initDef);  //初始化gpioc
}
	
/**
	返回那个键被按下
	 1 key1被按下
	 2 key2被按下
	 3 key3被按下
	 4 key4被按下
**/
u8 keyScan(u8 holdPrcssedCount){
	//版本1：延迟消抖  一直按下某个键，会返回按了多次，根据业务需求判断是否是问题，比如输入密码，只能算一次，玩游戏按下姚一直生效
  u8 ret = 0;
	/*if(key1==0){
		 delay_ms(10);
		 if(key1==0){
			 return key1_pressed_ret;
		 }
	}else if(key2==0){
		delay_ms(10);
		if(key2==0){
			return key2_pressed_ret;
		}
	}
	else if(key3==0){
		 delay_ms(10);
		 if(key3==0){
		   return key3_pressed_ret;
		 }
	}else if(key4==0){
		 delay_ms(10);
		 if(key4==0){
				return key4_pressed_ret;
		 }
	}*/
	
	// 版本2 优化方案1代码结构
	/*
	if(key1==0 || key2==0 || key3==0 || key4==0){
			delay_ms(10);
	 	  if(key1==0) return key1_pressed_ret;
		  if(key2==0) return key2_pressed_ret;
		  if(key3==0) return key3_pressed_ret;
		  if(key4==0) return key4_pressed_ret;
	}*/
	
	//版本3 长按只算一次
	/*
	static u8 flag = 1;
	if(flag&& (key1==0 || key2==0 || key3==0 || key4==0)){
			delay_ms(10);
		  flag = 0;
	 	  if(key1==0) return key1_pressed_ret;
		  if(key2==0) return key2_pressed_ret;
		  if(key3==0) return key3_pressed_ret;
		  if(key4==0) return key4_pressed_ret;
	}else if(key1==1 && key2==1 && key3==1 && key4==1){ //四个都是松开才是松开
		 //按了松开，下次还能按
		 delay_ms(10);
		 if(key1==1 && key2==1 && key3==1 && key4==1){
			 flag = 1;
		 }
	}*/
	
	//版本4： 允许函数调用者传入长按算多次
	static u8 flag = 1;
	if((holdPrcssedCount || flag)&& (key1==0 || key2==0 || key3==0 || key4==0)){
			delay_ms(10);
		  flag = 0;
	 	  if(key1==0) return key1_pressed_ret;
		  if(key2==0) return key2_pressed_ret;
		  if(key3==0) return key3_pressed_ret;
		  if(key4==0) return key4_pressed_ret;
	}else if(key1==1 && key2==1 && key3==1 && key4==1){ //四个都是松开才是松开
		 //按了松开，下次还能按
		 delay_ms(10);
		 if(key1==1 && key2==1 && key3==1 && key4==1){
			 flag = 1;
		 }
	}
	
	
	
	
	
	return ret;
}
